#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

// int main(){
//     printf("pid: %d\n",getpid());//进程id
//     printf("ppid: %d\n",getppid());//父进程id
//     return 0;
// }

// int main()
// {
//     //fork有两个返回值
//     //⽗⼦进程代码共享，数据各⾃开辟空间，私有⼀份（采⽤写时拷⻉）
//     int ret = fork();
//     printf("hello proc : %d!, ret: %d\n", getpid(), ret);
//     sleep(1);
//     return 0;
// }

// int main()
// {
//     //对于子进程会返回0
//     //对于父进程会返回子进程pid
//     //创建子进程错误会返回小于0的数
//     int ret = fork();
//     if (ret < 0)
//     {
//         perror("fork");
//         return 1;
//     }
//     else if (ret == 0)
//     { // child
//         printf("I am child : %d!, ret: %d\n", getpid(), ret);
//     }
//     else
//     { // father
//         printf("I am father : %d!, ret: %d\n", getpid(), ret);
//     }
//     sleep(1);

//     return 0;
// }

// 对于进程存在下面几种状态
//  static const char *const task_state_array[] = {
//      "R (running)", /*0 */
//      "S (sleeping)", /*1 */可以理解为scanf邓，等待用户输入
//      "D (disk sleep)", /*2 */当我们向硬盘写入时，用户为了使文件写入时，不可中断，操作系统就会把此文件设置为不可睡眠状态
//      "T (stopped)", /*4 */
//      "t (tracing stop)", /*8 */
//      "X (dead)", /*16 */
//      "Z (zombie)", /*32 */僵尸进程意味着子进程退出时，父进程一直等待子进程waitpit，子进程退出，父进程还在运行
//  }

//僵尸进程
#include <stdio.h>
#include <stdlib.h>
int main()
{
    pid_t id = fork();
    if (id < 0)
    {
        perror("fork");
        return 1;
    }
    else if (id > 0)
    { // parent
        printf("parent[%d] is sleeping...\n", getpid());
        sleep(30);
        //父进程还在等待子进程退出码
    }
    else
    {
        printf("child[%d] is begin Z...\n", getpid());
        sleep(5);
        exit(EXIT_SUCCESS);//子进程退出
    }

    return 0;
    //zrj       299004  0.0  0.0   2488   580 pts/1    S+   22:54   0:00 ./test
    //zrj       299005  0.0  0.0   2488    76 pts/1    S+   22:54   0:00 ./test
}